﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#ifdef  GM_PROCESS_POOL_HOME
#define GM_PROCESS_POOL_EXPORT __declspec(dllexport)
#else
#define GM_PROCESS_POOL_EXPORT __declspec(dllimport)
#endif

#include "ProcessInfo.h"
#include <string>

// 技术文档wiki:
// https://km.glodon.com/pages/viewpage.action?pageId=229192717

/// \brief 宿主进程调用，用来创建一个系统级的进程池
///
/// \param processPath 族服务进程的路径
/// \param count 进程池中进程的个数
/// \param debugMode 开启后，族服务进程被创建时主线程会挂起，这时可以用调试器附加到该进程上来进程调试
/// \return 返回是否创建成功
GM_PROCESS_POOL_EXPORT 
bool ProcessPool_CreateAsync(const std::wstring& processPath, int count, bool debugMode = false);

/// \brief 子进程调用，用来连接到一个系统级的进程池上
///
/// \param processPath 族服务进程的路径
/// \param exitCallback 族服务进程退出时的回调
/// \return 返回是否连接成功
GM_PROCESS_POOL_EXPORT 
bool ProcessPool_Attach(const std::wstring& processPath, const std::function<void()>& exitCallback);

/// \brief 子进程调用，用来连接到一个系统级的进程池上
///
/// \param exitCallback 族服务进程退出时的回调
/// \return 返回是否连接成功
GM_PROCESS_POOL_EXPORT
bool ProcessPool_AttachCurrent(const std::function<void()>& exitCallback);

/// \brief 从进程池断开
///
/// \return 返回是否成功
GM_PROCESS_POOL_EXPORT
bool ProcessPool_Detach();

/// \brief 从进程池中弹出一个子进程
///
/// \param ProcessInfo 子进程信息
/// \return 返回是否弹出成功
GM_PROCESS_POOL_EXPORT 
bool ProcessPool_TakeOne(ProcessInfo& ProcessInfo);

/// \brief 归还进程池中弹出的一个子进程
///
/// \param info 子进程信息
/// \return 返回是否归还成功
GM_PROCESS_POOL_EXPORT
bool ProcessPool_GiveBack(const ProcessInfo& info);